package com.ls.fw.token.handler;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ls.fw.token.annotation.RequireToken;
import com.ls.fw.token.support.TokenRepository;


/**
 * token處理器
 * 
 * @author lisheng
 * @date 2015年12月24日 下午6:36:31
 * @version V1.0
 */
public interface HttpTokenHandler {
	public TokenRepository getTokenRepository() ;
	/**
	 * 获取token对应的key
	 * @author lisheng
	 * @date 2016年2月28日 下午9:38:51
	 * @version V1.0
	 * @param request
	 * @return
	 */
	String getKey(HttpServletRequest request,String token);
	
	
	/**
	 * 檢查token是否有效
	 * 
	 * @author lisheng
	 * @date 2015年12月24日 下午6:36:13
	 * @version V1.0
	 * @param request
	 * @param token
	 * @return
	 */
	boolean checkToken(HttpServletRequest request,String token);

	/**
	 * 生成token
	 * @author lisheng
	 * @date 2016年2月28日 下午9:18:21
	 * @version V1.0
	 * @param request
	 * @param response
	 * @param token
	 * @return
	 */
	String createToken(HttpServletRequest request,  HttpServletResponse response, String token);
	
	/**
	 * 删除token
	 * @author lisheng
	 * @date 2016年2月28日 下午9:18:13
	 * @version V1.0
	 * @param request
	 * @param response
	 * @param token
	 */
	void removeToken(HttpServletRequest request,  HttpServletResponse response, String token);
	
	/**
	 * 獲取token
	 * 
	 * @author lisheng
	 * @date 2015年12月24日 下午6:36:04
	 * @version V1.0
	 * @param request
	 * @return
	 */
	String getToken(HttpServletRequest request,String token,boolean createIFNoExist);
	
	
	/**
	 * 驗證成功
	 * 
	 * @author lisheng
	 * @date 2015年12月24日 下午6:35:55
	 * @version V1.0
	 * @param request
	 * @param response
	 * @param token
	 */
	void success(HttpServletRequest request,  HttpServletResponse response, String token,RequireToken chekToken);
	
	
	/**
	 * 驗證token失敗
	 * @author lisheng
	 * @date 2015年12月24日 下午6:35:32
	 * @version V1.0
	 * @param request
	 * @param response
	 * @param token
	 * @throws IOException 
	 */
	void fail(HttpServletRequest request,  HttpServletResponse response, String token) throws IOException;



    /**
     * 对原始token进行解密、解码、时间戳验证、url签名等一系列操作的扩展接口
     * @param baseToken 原始token
     * @param request   该次请求的request对象
     * @return          存放映射关系的token
     */
    String decodeToken(String baseToken, HttpServletRequest request);


}
